// 为设置出口引入 path 模块
const path = require('path')
// 引入 html-webpack-plugin
const HtmlWebpackPlugin = require('html-webpack-plugin')

module.exports = {
    // 设置默认模式为生产
    mode: 'production',
    // 设置入口
    entry: './src/main.js',
    // 设置出口
    output: {
        path: path.join(__dirname, 'dist'),
        // 设置出口位置
        filename: 'bundle.js',
        // 清空之前打包的代码
        clean: true,
    },
    // 使用 HtmlWebpackPlugin 插件以某个 html 为模板生成新的 html 文件并且吧打包好的代码引入
    plugins: [new HtmlWebpackPlugin({
        // 设置对应 html 文件
        template: './public/index.html'
    })],
    module: {
        // loader 的规则
        rules: [
            // 从官网 https://webpack.docschina.org/loaders/css-loader/ CV
            // 解析 CSS
            {
                test: /\.css$/i,
                use: ["style-loader", "css-loader"],
            },
            // 从官网 https://webpack.docschina.org/loaders/less-loader/ CV
            // 解析 less
            {
                test: /\.less$/i,
                use: [
                    'style-loader',
                    'css-loader',
                    'less-loader',
                ],
            },
            // 加入图片
            {
                test: /\.(png|jpg|gif|jpeg)$/i,
                // asset 小于 8k 的将会转换为 base64 减少网路请求
                type: 'asset', 
            },
            // 处理字体文件
            {
                test: /\.(eot|svg|ttf|woff|woff2)$/i,
                // asset/resource 不需要处理字体文件，直接原文件输出即可
                type: 'asset/resource',
                generator: {
                    // 设置新的位置 根据源文件名设置一个包含6位hash的原后缀 文件保存在新的路径
                    filename: 'font/[name].[hash:6][ext]'
                }
            },
            // 使用 babel 来降级到 ES5 提高兼容性
            {
                test: /\.js$/i,
                exclude: /(node_modules)|(bower_components)/,
                use: {
                    loader: 'babel-loader',
                    options: {
                        presets: ['@babel/preset-env']
                    }
                }
            }
        ]
    },
    // 设置调试服务器
    devServer: {
        // 修改端口号
        port: 1919
    }
}